package rhplus.servico;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;
import javax.jdo.PersistenceManager;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import rhplus.acessoBD.PMF;
@PersistenceCapable
public class ServicoGenerico implements Serializable{

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id_servico_generico;
    @Persistent
    private String tipo;
    @Persistent
    private String especialidade;
    @Persistent
    private Double preco;

    /** Creates a new instance of ServicoGenerico */
    public ServicoGenerico(final Long id_servico_generico, final String tipo, final String especialidade, final double preco) {

        this.id_servico_generico = id_servico_generico;
        this.tipo = tipo;
        this.especialidade = especialidade;
        this.preco = preco;
    }

    public Long getIdServicoGenerico() {
        return id_servico_generico;
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(final String tipo) {
        this.tipo = tipo;
    }

    public String getEspecialidade() {
        return especialidade;
    }

    public void setEspecialidade(final String especialidade) {
        this.especialidade = especialidade;
    }

    public double getPreco() {
        return this.preco;
    }

    public void setPreco(final double preco) {
        this.preco = preco;
    }

    public static ServicoGenerico devolve(final Long id_servico_generico) throws SQLException, ClassNotFoundException, InstantiationException,
            IllegalAccessException {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + ServicoGenerico.class.getName()
                + " where id_servico_generico == " + id_servico_generico;

        List<ServicoGenerico> servico_generico = (List<ServicoGenerico>) pm.newQuery(query).execute();

        return servico_generico.get(0);

    }

    public static ServicoGenerico devolve(final String tipo, final String especialidade) throws SQLException, ClassNotFoundException,
            InstantiationException, IllegalAccessException {


        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + ServicoGenerico.class.getName()
                + " where tipo == '" + tipo + "' && especialidade == '" + especialidade + "'";

        List<ServicoGenerico> servico_generico = (List<ServicoGenerico>) pm.newQuery(query).execute();

        return servico_generico.get(0);

    }

    public static void insere(ServicoGenerico dados_do_servico_generico) throws SQLException, ClassNotFoundException,
            InstantiationException, IllegalAccessException {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        try {
            pm.makePersistent(dados_do_servico_generico);
        } finally {
            pm.close();
        }
    }

    public static void insereServicoDisponivelSeNaoExistir(final Long id_hospital, final Long id_servico_generico)
            throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + ServicoGenerico.class.getName()
                + "where id_hospital == " + id_hospital + " && id_servico_generico == " + id_servico_generico;

        ServicoGenerico existe_servico = (ServicoGenerico) pm.newQuery(query).execute();

        if (existe_servico == null) {

            ServicoGenerico novo = new ServicoGenerico(id_servico_generico, "", "", 0);
            insere(novo);
        }


    }

    public static void altera(ServicoGenerico dados_do_servico_generico) throws SQLException, ClassNotFoundException,
            InstantiationException, IllegalAccessException {


        PersistenceManager pm = PMF.get().getPersistenceManager();

        String new_tipo = dados_do_servico_generico.getTipo();
        String new_especialidade = dados_do_servico_generico.getEspecialidade();
        double new_preco = dados_do_servico_generico.getPreco();

        try {
            pm.currentTransaction().begin();

            dados_do_servico_generico = pm.getObjectById(ServicoGenerico.class, dados_do_servico_generico.getIdServicoGenerico());
            dados_do_servico_generico.setTipo(new_tipo);
            dados_do_servico_generico.setEspecialidade(new_especialidade);
            dados_do_servico_generico.setPreco(new_preco);

            pm.makePersistent(dados_do_servico_generico);
            pm.currentTransaction().commit();

        } catch (Exception ex) {
            pm.currentTransaction().rollback();
            throw new RuntimeException(ex);
        } finally {
            pm.close();
        }
    }

    public static void remove(final int id_servico_generico) throws SQLException, ClassNotFoundException, InstantiationException,
            IllegalAccessException {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        try {
            pm.currentTransaction().begin();

            ServicoGenerico servico_generico = pm.getObjectById(ServicoGenerico.class, id_servico_generico);
            pm.deletePersistent(servico_generico);

            pm.currentTransaction().commit();
        } catch (Exception ex) {
            pm.currentTransaction().rollback();
            throw new RuntimeException(ex);
        } finally {
            pm.close();
        }
    }

    public static boolean eTipoExame(Long servicoGenerico) {
        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + ServicoGenerico.class.getName()
                + "where tipo='exame'  && id_servico_generico == " + servicoGenerico;

        return !((List<ServicoGenerico>) pm.newQuery(query).execute()).isEmpty();
    }

//    public static boolean temConsultaParaHora(final int id, final Date data_consulta) throws SQLException, ClassNotFoundException,
//            InstantiationException, IllegalAccessException {
//        System.out.println("ora bem: " + data_consulta);
//
//        String databd = UtensiliosParaDatas.devolveDataEHoraParaBD(data_consulta.getYear(), data_consulta.getMonth(), data_consulta.getDate(), data_consulta.getHours(), data_consulta.getMinutes());
//
//        // Consulta a BD
//        System.out.println("data aki neste sitio: " + databd);
//
//        AcessoBD acesso_bd = new AcessoBD();
//        acesso_bd.carregaDriverEAbreLigacao();
//
//        String qryName = new String("devolver_consulta_por_data");
//
//        Hashtable<String, Object> dados_consulta = new Hashtable<String, Object>();
//        dados_consulta.put("var_id_utente", id);
//
//        dados_consulta.put("var_data", databd);
//
//        ResultSet result_set = acesso_bd.executaSelect(qryName, dados_consulta);
//
//        LinkedList<String> lista_consultas = new LinkedList<String>();
//
//        while (result_set.next()) {
//            String data = (String) result_set.getString("data");
//            lista_consultas.add(data);
//            System.out.println("Data: " + data);
//        }
//
//        return lista_consultas.isEmpty();
//    }

    
    
    public static LinkedList<String> devolveEspecialidades()
            throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {


         PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + ServicoGenerico.class.getName()
                + " where tipo == 'exame'";

        List<ServicoGenerico> servico_generico = (List<ServicoGenerico>) pm.newQuery(query).execute();

        LinkedList<String> nova = new LinkedList<String>();

        for(ServicoGenerico s : servico_generico){
            nova.add(s.getEspecialidade());
        }

        return nova;

    }
}
